<?php
/******************************************************************************
一 ： call 如何请求OPenApi
  1. call::run(类名，函数名，参数1。。。);
  2. call::run_alias(类名，函数名，类别名，参数1。。。);
实例操作：
$data = call::load()->run('users', 'get_user_name', $params1, $p2, $p3 ...);
var_dump($data);

 ******************************************************************************/
/**
 * API函数调用
 * @date 2015-12-11
 * @author wzl
 * @see 此类只限调用openapi服务下的Open/controllers或Open/models下的类，自动识别
 */
class call {
    /**请求的远程URL*/
    private static $url = null;
    /**设置类的别称，当文件与类名不相同时使用*/
    public static $alias_class = null;
    /**是否调用线上数据，默认false,设置true则调线上*/
    public static $is_online = false;
    /**
     * 设置是URL
     * @param boolean $is_host 默认为true, 是否执行本地，true为调用本地，false调用线上
     */
    private static function set_url() {
        $ip = $_SERVER['SERVER_ADDR'];
        if($ip == '127.0.0.1' && self::$is_online === false) {
            self::$url = 'http://www.open.cc/index.php';
        } else {
            self::$url = 'http://ts.local.openapi/index.php';
        }
    }
    
    /**
     * class,method 支持文件名与类同名
     * @param string $class 文件名称 默认为与类相同，若不同则调用run_alias或set_alias
     * @param string $method 方法名称
     * @param mix $params 【可选】支持多个参数
     * @date 2015-12-11
     * @author wzl
     * @return array 返回值
     */
    public static function run($class, $method) {
        self::set_url();
        $params_num = func_num_args();
        $data_params = array();
        if($params_num >= 2) {
            $args_arr = func_get_args();
            for($i = 2; $i < $params_num; $i ++) {
                $data_params[] = $args_arr[$i];
            }
        }
        return self::_run($class, $method, $data_params);
    }
    /**
     * 支持类别名函数 class,method,alias
     * @param string $class 文件名称 默认为与类相同，若不同则调用run_alias或set_alias
     * @param string $method 方法名称
     * @param string $alias 类别名
     * @return array 返回值
     */
    public static function run_alias($class, $method, $alias) {
        self::set_url();
        self::$alias_class = $alias;
        $params_num = func_num_args();
        $data_params = array();
        if($params_num >= 3) {
            $args_arr = func_get_args();
            for($i = 3; $i < $params_num; $i ++) {
                $data_params[] = $args_arr[$i];
            }
        }
        return self::_run($class, $method, $data_params);
    }
    /**
     * 相同于get_config_params 函数，读取data_config/config_params.php
     * @param string $parent 父节点
     * @param string $son 子节点
     * @param string $grandson 孙节点
     * @return mix 结果
     */
    public static function get_config_params($parent, $son, $grandson) {
        return self::run('get_config', 'params', $parent, $son, $grandson);
                
    }
    /**
     * 相同于 get_config_actives 函数，读取data_config/get_config_actives.php
     * @param string $parent 父节点
     * @param string $son 子节点
     * @param string $grandson 孙节点
     * @return mix 结果
     */
    public static function get_config_actives($parent, $son, $grandson) {
        return self::run('get_config', 'actives', $parent, $son, $grandson);
    }

    /**
     * 设置类别名。配合run使用，写在run之前
     * @param string $alias_class
     */
    public static function set_alias($alias_class) {
        self::$alias_class = $alias_class;
    }

    /**
     * run函数
     * @param string $class 类名
     * @param string $method 方法名
     * @param string $data_params 数据
     * @return mix
     */
    private static function _run($class, $method, $data_params) {
        $params = array(
            'c' => $class,
            'm' => $method,
        );
        if(self::$alias_class != null) {
            $params['a'] = self::$alias_class;
        }
        $params_string = self::toString($params);
        $url = self::$url . '?' . $params_string;
        $base = new OpenApiClient();   
        $result = $base->send($url, $data_params);
        mylog_debug(array(
            'url' => $url,
            'result' => $result,
            'data_params' => $data_params,
        ), '_run');
        if($result['status'] == 0) {
            return $result['data'];
        } else {
            mylogger($result, 'call调用出错');
            return $result;
        }
    }
    /**
     * 将数组拼接字符串 包括KEY=>VALUE
     * @param array $arr 需要拼接的数组
     * @return string 字符串
     */
    protected static function toString($arr) {
        $string = '';
        if(is_array($arr)) {            
            foreach ($arr as $key => $value) {
                $string .= $key . '=' . $value . '&';
            }
            $string = trim($string, '&');            
        }
        return $string;
    }
}
